home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
sys
/
kowin14d.lzh
/
doc
/
library
/
GOELIB.MAN
< prev
next >
Wrap
Text File
|
1992-10-26
|
10KB
|
351 lines
Ko-Window パーツライブラリ goelib.a v1.04 1992/10/25 by Goemon
○スライドスイッチ(スライダー)関数
・スライドスイッチ構造体
スライドスイッチ関数では以下の構造体を使用してスライドスイッチ処理を行います
typedef struct { /* スライドスイッチ構造体 */
int num; /* 番号 */
int x; /* x座標 */
int y; /* y座標 */
int max; /* 最大 */
int nx; /* 数値表示のx座標 */
int ny; /* 数値表示のy座標 */
int nmin; /* 数値の最小値 */
int nmax; /* 数値の最大値 */
int nmode; /* 数値表示モード(0は普通,1は反転) */
int npos; /* 現在位置(相対位置)*/
int nc; /* 表示桁数(符号は含まず)*/
int nsize; /* 文字サイズ */
char nstr[16];/*数値表示用文字バッファ*/
GSliderPat *gspat; /*スライダーパターン*/
} GSlider;
typedef struct { /* スライドスイッチパターン構造体 */
int mode; /* 0:横 1:縦 */
Sheet *Slider; /*スライダーパターン*/
Sheet *Rale[2]; /*溝パターン*/
Sheet *Start; /*溝の開始パターン*/
Sheet *End[2]; /*溝の終了パターン*/
} GSliderPat;
※パターン設定の規則
必ずすべてのパターンの大きさは同じにして下さい。
配列になっているパターンは、0が偶数位置用のパターン、1が奇数位置用のパターン
です。
また、標準パターンとして、以下のパターンが設定されています。
GSliderPat GSliderStPatX;(横方向)
GSliderPat GSliderStPatY;(縦方向)
・スライドスイッチの仕様について
番号は、後ででてくる登録簿管理で使用します。
x,y座標は、ウインドウ上でのスライドスイッチの左上の座標です。
最大は、ウインドウ上のスライドする量に対する最大値です。
nx,nyは、ウインドウ上での数字表示の左上の座標です。
nmin,nmaxは、表示する数値の最小、最大値です。
表示桁数は符号も含む桁数です。0以上の数値しか使用しない場合は、符号の桁は考
えなくても構いません。
また、0を指定すると数字の表示は行いません。
現在位置はnmin~nmaxの間を指定して下さい。相対量で扱います。
数値表示モードは、0なら普通、1なら反転します。(特に縦のスライドスイッチで
使用すると思われます)
文字サイズは、12/16/24のいずれかを指定します。
文字バッファは、いじらないで下さい。数値の表示に使用しています。
スライダーパターンは、スライドスイッチパターン構造体のポインタを指定して下さ
い。
ドット数より数値の幅が大きい場合は、数値が飛ばされてしまいますが、数値表示の
上でクリックする事により微調整出来ますので、気にしなくても大丈夫だと思われま
す。
・スライドスイッチの描画
int GSliderSetDraw( gs, dbuf );
GSlider *gs; スライドスイッチ構造体
DrawBuf *dbuf; 描画バッファ
スライドスイッチ構造体を元にスライドスイッチを描画します。
スライドの溝(?)や数字も描画します。
戻り値はDrawBufに書き込んだ個数です。
この関数は、主にEventRedraw内で使用します。
・スライドスイッチの移動
int GSliderSetPos( gs, dbuf, pos );
GSlider *gs; スライドスイッチ構造体
DrawBuf *dbuf; 描画バッファ
int pos; スライドスイッチの移動先
スライドスイッチ構造体のposから第3引き数の位置までスイッチを移動します。
用途としては、値の微調節などで、外部からコントロールする場合などではないかと
思われます。(一応範囲外チェックはしています。)
数字も書き換えます。
戻り値はDrawBufに書き込んだ個数です。
この関数は、主にEventMouseSwitch内で使用します。
・マウス位置からPOS位置計算
int GSliderGetMPos( gs, mx, my, stat1, stat2, stat3 )
GSlider *gs; スライドスイッチ構造体
int mx; マウスカーソルのx座標
int my; マウスカーソルのy座標
int stat1; スライドスイッチの有効条件
int stat2; 数字の有効条件(+)
int stat3; 数字の有効条件(-)
マウスカーソルの位置とマウスボタンの状態(第2、第3引き数、第4引き数:x,y
,stat1)よりスライドスイッチ登録簿内から第2引き数で指定したキー番号のスライ
ドスイッチに対するPOS位置を計算します。
数字の表示の上にマウスカーソルがある場合、第5引き数で指定した状態を満たす
場合、pos+1、第6引き数で指定した条件を満たす場合、pos-1が返ります。
この関数は、EventMouseSwitch内で使用します。
・マウスがスライダーの範囲内に入っているか
int GSliderGetMPoint( gs, mx, my )
GSlider *gs; スライドスイッチ構造体
int mx; マウスカーソルのx座標
int my; マウスカーソルのy座標
マウスの位置(第2、第3引き数:x,y)が指定されたスライダーを指すかどうかを
調べます。(0以外の時、マウスカーソルがスライダーを指しています)
数字表示の位置も関知します。
これは、EventMouseSwitch内で使用します。
マクロです。
・スライダーの現在位置を得る
int GSliderGetPos( gs )
GSlider *gs; スライドスイッチ構造体
指定したスライダーのPOS位置を得ます。
マクロです。
○スライドスイッチ登録簿
スライドスイッチを索引によって管理します。これにより、スライドスイッチの扱い
が、楽になります。(?)
これを使用する場合、ヒープ領域を使用しますので、WindowHeapSizeを確保して下さ
い。
これらの関数は以下の構造体を使用します。
typedef struct { /* スライドスイッチ辞書構造体 */
int max; /*最大登録件数*/
int num; /*現在の登録件数*/
GSlider *gs; /*スライドスイッチ構造体の先頭*/
} GSliderReg;
・登録簿の作成
void GsRegOpen( gsr, max )
GSliderReg *gsr; スライドスイッチ登録簿構造体
int max; スライドスイッチの最大登録件数
スライドスイッチ登録簿を作成します。第2引き数は、登録するスライドスイッチの
最大登録数です。
マクロです。
これは、EventOpen内で使用します。
・登録簿の破棄
void GsRegClose( gsr )
GSliderReg *gsr; スライドスイッチ登録簿構造体
スライドスイッチ登録簿を破棄します。
マクロです。
これは、EventClose内で使用します。
・スライドスイッチ登録
void GSRegSetGSlider( gsr, num, x, y, len, nmin, nmax, nmode, pos,
nx, ny, nc, nsize, gsp )
GSliderReg *gsr; スライドスイッチ登録簿構造体
int num; スライドスイッチ識別番号
int x; スライドスイッチのx座標
int y; スライドスイッチのy座標
int len; スライド幅
int nmin; 数字表示の最大値
int nmax; 数字表示の最小値
int nmode; 数字表示モード(0:普通,1:反転)
int nx; 数字表示のx座標
int ny; 数字表示のy座標
int nc; 数字の最大桁数(0だと表示しない)
int nsize; 数字表示の文字サイズ
GSliderPat *gsp; スライドスイッチパターン構造体
スライドスイッチ登録簿にスライドスイッチを登録します。
スライド幅は、溝の長さです。
もし、スライドスイッチのパターンの幅が6ドットの場合、実際に移動するドット数
は、指定した長さよりも6ドット引かれます。
(例えば30で指定すると24ドットしか動かないわけです。)
これは、EventOpen内で使用します。
・登録簿内のスライダーの描画
int GsRegSetDraw( gsr, dbuf );
GSliderReg *gsr; スライドスイッチ登録簿構造体
DrawBuf *dbuf; 描画バッファ
スライドスイッチ登録簿を元にスライドスイッチをすべて描画します。
戻り値はDrawBufに書き込んだ個数です。
この関数は、EventRedraw内で使用します。
・マウスカーソル位置から登録簿内の任意のスライダーを選ぶ */
int GsRegSelectGSlider( gsr, mx, my );
GSliderReg *gsr; スライドスイッチ登録簿構造体
int mx; マウスカーソルのx座標
int my; マウスカーソルのy座標
ウインドウ内で、マウスの指すスライドスイッチを登録簿内から選び出します。
戻り値は、識別番号です。
主にEventMouseSwitch内で使用します。
・登録簿検索
GSlider *GsRegGetGSlider( gsr, num );
GSliderReg *gsr; スライドスイッチ登録簿構造体
int num; スライドスイッチ識別番号
スライドスイッチ登録簿内から第2引き数で指定したキー番号のスライドスイッチ構
造体を得ます。
・スライダーの現在位置を得る
int GsRegGetPos( gsr, num )
GSliderReg *gsr; スライドスイッチ登録簿構造体
int num; スライドスイッチ識別番号
GSliderGetPosと同じです。
マクロです。
・マウス位置からPOS位置計算
int GsRegGetMPos( gsr, num, mx, my, stat1, stat2, stat3 )
GSliderReg *gsr; スライドスイッチ登録簿構造体
int num; スライドスイッチ識別番号
int mx; マウスカーソルのx座標
int my; マウスカーソルのy座標
int stat1; スライドスイッチの有効条件
int stat2; 数字の有効条件(+)
int stat3; 数字の有効条件(-)
動作はGSliderGetMPosと同じです。
マクロです。
・スライドスイッチの移動
int GsRegSetPos( gsr, dbuf, num, pos )
GSliderReg *gsr; スライドスイッチ登録簿構造体
DrawBuf *dbuf; 描画バッファ
int num; スライドスイッチ識別番号
int pos; スライドスイッチの移動先
動作はGSliderSetPosと同じです。
マクロです。
・具体的な使用例(?)(うぅぅむ、参考になるのかなぁ)
#include <stdio.h>
#include <iocslib.h>
#include <wlib.h>
#include <parts.h>
#include <winop.h>
#include <goelib.h>
#define SW1 1
#define SW2 2
GSliderReg gsr;
int WindowHeapSize= 2 * 1024;
EventExec( wp, info )
WindowID wp;
EventInfo *info;
{
DrawBuf dbuf[256];
DrawBuf *pdbuf;
char wa[5];
int dumy;
pdbuf = dbuf;
switch( info->option ){
case EventOpen:
WindowSetEventAttr( wp, EventAttrDefault);
/**/
GSRegOpen(&gsr,2);
GSRegSetGSlider(&gsr,SW1,2,2,68,-45,45,0,0,20,20,3,12,&GSliderStPatX);
GSRegSetGSlider(&gsr,SW2,2,16,36,0,15,1,0,20,46,3,12,&GSliderStPatY);
/**/
WindowRedraw( wp );
return TRUE;
case EventResize:
return TRUE;
case EventClose:
/**/ GSRegClose(&gsr);
WindowClose( wp );
WindowConnectionClose();
return TRUE;
case EventRedraw:
DrawSetClear( pdbuf, 1 );
pdbuf++;
/**/ pdbuf += GSRegSetDraw( &gsr,pdbuf);
DrawSetLine( pdbuf,19,19,38,32,ShadowDown,OptionShadow);
pdbuf++;
DrawSetLine( pdbuf,19,45,38,58,ShadowDown,OptionShadow);
pdbuf++;
WindowDraw( wp, dbuf, pdbuf - dbuf );
return TRUE;
case EventMouseSwitch:
{
int mx = info->x;
int my = info->y;
int wx;
int wy;
int stat1 = info->LeftStat;
int stat2 = info->LeftON;
int stat3 = info->RightON;
int num;
int pos;
/**/
if(num = GSRegSelectGSlider( &gsr,mx,my)){
pos = GSRegGetMPos(&gsr,num,mx,my,
stat1,stat2,stat3);
pdbuf += GSRegSetPos(&gsr,pdbuf,num,pos);
/**/
switch(num){
case SW1:
/*値が変わった!*/
break;
case SW2:
/*これも値が変わった!(c)COR.(笑)*/
break;
}
WindowDraw( wp, dbuf, pdbuf - dbuf );
}
}
return TRUE;
}
return FALSE;
}
WindowMain( argc, argv )
int argc;
char **argv;
{
int x= 8, y= 8, h= 200, v= 100;
argc= AnalyzeArgs( argc, argv, &x, &y, 0, 0 );
WindowTitleOpen( x, y, h, v, NULL, "GSliderTest", Close|Push , EventExec );
}